// 1、通过 interface 声明
// 接口用于定义一组方法和属性的规范，这些方法都应该是抽象的，需要由具体的类去实现
// 需要注意的是，接口只是一种类型约束，不会被编译成任何JavaScript代码。
interface MySex {
    name: string,
    age: number
}

// 2、使用
let b1: MySex = {
    name: "",
    age: 0
}
console.log(b1.age);

let b2: MySex = {
    name: "",
    age: 0
}
console.log(b2.name);

// 接口和类型的区别
// 机同点
//   1) 都可为w作为变量的类型
// 不同点
//   1) 接口只能为对象指定类型
//   2) 类型别名，不仅可以为对象指定类型，实际上可以为任意类型指定别名。如 type NumStr = number | string，相当于声明了一个复合体。

// 接口的继承
interface Point2D {
    x: number,
    y: number,
    area: (num1: number, num2: number) => void,
    greet: () => void
}
// 通过extends实现继承
interface Point3D extends Point2D {
    z: number
}

let b3: Point3D = {
    z: 0,
    x: 0,
    y: 0,
    area: (num1, num2) => {
        return num1 + num2;
    },
    greet() {
        console.log(`Hello, my name is ${this.x}, and I am ${this.y} years old.`);
    }
}

let b4 = {} as Point3D;
b4.x = b4.y = b4.z = 0;
b4.area = function (num1, num2) { return num1 + num2 };